package com.wongsir.step3.tiny_ioc.factory;

import java.lang.reflect.Field;

import com.wongsir.step3.tiny_ioc.BeanDefinition;
import com.wongsir.step3.tiny_ioc.PropertyValue;

/**
 * 可自动装配内容的BeanFactory
 * @author wongsir
 * @date 2018年9月13日
 */
public class AutowireCapableBeanFactory extends AbstractBeanFactory{

	@Override
	protected Object doCreateBean(BeanDefinition beanDefinition) throws Exception {
		Object bean = createBeanInstance(beanDefinition);//bean对象实例化
		applyPropertyValues(bean,beanDefinition);//属性注入
		return bean;
	}

	/**
	 * 属性注入
	 * @param bean
	 * @param mbd
	 * @throws Exception
	 */
	protected void applyPropertyValues(Object bean, BeanDefinition mbd) throws Exception{
		for(PropertyValue propertyValue : mbd.getPropertyValues().getPropertyValues()) {
			// Field提供有关类或接口的单个字段的信息和动态访问。 反射的字段可以是类（静态）字段或实例字段。 
			Field declaredField = bean.getClass().getDeclaredField(propertyValue.getName());
			declaredField.setAccessible(true);
			declaredField.set(bean, propertyValue.getValue());
		}
	}

	protected Object createBeanInstance(BeanDefinition beanDefinition) throws Exception{
		return beanDefinition.getBeanClass().newInstance();
	}

}
